#include "registro_mod_insumos.h"
#include "ui_registro_mod_insumos.h"
#include <qmessagebox.h>



Registro_Mod_Insumos::Registro_Mod_Insumos(QWidget *parent,Insumo *ins,Insumo_Proveedor *insprov):
    QDialog(parent),
    ui(new Ui::Registro_Mod_Insumos)
{

         QDjango::setDebugEnabled(true);
         band = false;
         ui->setupUi(this);
         this->setWindowFlags(Qt::Tool);
         this->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, this->size(), qApp->desktop()->availableGeometry()));

         ui->tableWidget->hideColumn(2);
         ui->tableWidget->hideColumn(3);

         ui->tableWidget->resizeColumnsToContents();
         ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

         const QString M1 = "Unidad";
         ui->combomedida->addItem(M1);
         ui->botonQuitar->setVisible(true);
         ui->cantidad->setEnabled(false);

         QDjangoQuerySet<Unidad_medida> unidad;
         if (unidad.count() > 0) foreach(const Unidad_medida &unid, unidad){ui->combomedida->addItem(unid.getDescripcion());}

         QDjangoQuerySet<Proveedor> proveedor;
         if (proveedor.count() > 0){
             foreach(const Proveedor &prov, proveedor)
             {
                 if (prov.getEstado() == "activo")
                 {
                    ui->listWidget->addItem(prov.getNombre());
                 }
             }
         }
         //***Validaciones**///
         validatorS = new QRegExpValidator(QRegExp("[^0-9]{40}"),this);
         ui->nombre->setValidator(validatorS);
         validatorN = new QIntValidator(1, 99999999);
         ui->cantidad->setValidator(validatorN);
         ui->stock_min->setValidator(validatorN);

         ui->idinsumo->setVisible(false);
         ui->idproveedor->setVisible(false);
         ui->medida->setVisible(false);
         ui->ultimacompra->setVisible(false);
         ui->nombre->setFocus();

        if(ins != NULL){

            QDjango::setDebugEnabled(true);
            this->setWindowTitle("Modificar Insumo");
            band = true;
            ui->cantidad->setEnabled(false);
            ui->idinsumo->setText(QString::number(ins->getIdinsumo()));
            ui->nombre->setText(ins->getNombre());
            ui->combomedida->setCurrentText(ins->getUnidad_medida());
            ui->cantidad->setText(QString::number(ins->getStock_actual()));
            ui->stock_min->setText(QString::number(ins->getStock_min()));
            ui->f_vencimiento->setDate(ins->getFechaVencimiento());
            QString id = QString::number(ins->getIdinsumo());

            QSqlQuery query;
            query.exec("select distinct proveedor.nombre,insumo_proveedor.precio,insumo_proveedor.proveedor_id,insumo_proveedor.id_insumo_proveedor from proveedor,insumo_proveedor,insumo where proveedor.id_proveedor = insumo_proveedor.proveedor_id and insumo_proveedor.insumo_id = "+id+";");

            int row = 0;
            const int col1 = 0;
            const int col2 = 1;
            const int col3 = 2;
            const int col4 = 3;

            while (query.next()){

                ui->tableWidget->insertRow(row);
                QString nombre      = query.value(0).toString(); //nombre del proveedor
                QString precio      = query.value(1).toString();
                QString id          = query.value(3).toString(); //id_insumo_proveedor
                QString idProveedor = query.value(2).toString();
                QTableWidgetItem *itemCol1 = new QTableWidgetItem(nombre);
                QTableWidgetItem *itemCol2 = new QTableWidgetItem(precio);
                QTableWidgetItem *itemCol3 = new QTableWidgetItem(id);
                QTableWidgetItem *itemCol4 = new QTableWidgetItem(idProveedor);

                ui->tableWidget->setItem(row,col1,itemCol1);
                ui->tableWidget->setItem(row,col2,itemCol2);
                ui->tableWidget->setItem(row,col3,itemCol3);
                ui->tableWidget->setItem(row,col4,itemCol4);
                row++;

            }

         }else
        {
            this->setWindowTitle("Registrar Insumo");

        }

}

Registro_Mod_Insumos::~Registro_Mod_Insumos(){
    delete ui;
}

void Registro_Mod_Insumos::on_cancelar_clicked()
{
    this->close();
}

void Registro_Mod_Insumos::on_aceptar_clicked()
{

    if(ui->nombre->text().simplified() == "" || ui->tableWidget->rowCount() == 0){

        if (ui->nombre->text().simplified() == "" || ui->stock_min->text().simplified() == ""){

           /* QMessageBox mensaje;
            mensaje.setText("Debe completar los campos obligatorios");
            mensaje.setInformativeText("<b>Campos obligatorios :</b><ul><li>Nombre</li><li>Stock Minimo</li></ul>");
            mensaje.setIcon(QMessageBox::Information);
            mensaje.exec();*/

            if(ui->nombre->text().simplified() == ""){
                ui->nombre->setFocus();
                QToolTip::showText(ui->nombre->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
            }
            else if(ui->stock_min->text().simplified() == ""){
                ui->stock_min->setFocus();
                QToolTip::showText(ui->stock_min->mapToGlobal(QPoint(10,8)), "Campo Obligatorio");
            }

         }else {
            QMessageBox mensaje;
            mensaje.setText("Debe asociar algun Proveedor al insumo");
            mensaje.setIcon(QMessageBox::Information);
            mensaje.exec();
        }

     }
     else{
        if(!band && existeEnLaBD("insumo", "nombre", ui->nombre->text().simplified()))
        {
            int var = 0;
            QDjangoQuerySet<Insumo> insumos;
            Insumo *ins = insumos.filter(QDjangoWhere("nombre", QDjangoWhere::Equals, ui->nombre->text().simplified())).at(0);

            if(ins->getEstado() == "inactivo"){
                var = cuadroMensaje("", "El insumo se encuentra como inactivo en la base de datos\nDesea volver a ponerlo activo?", "pregunta");
                if(var == QMessageBox::Ok){
                    ins->setEstado("activo");
                    ins->save();
                    this->close();
                }
            }
            else cuadroMensaje("Error en el Registro", "Ya se encuentra registrado un insumo con ese nombre", "error");
            delete ins;
        }
        else
        {

        QDjango::setDebugEnabled(true);
        Insumo *insumo = new Insumo();

        if (!ui->idinsumo->text().isEmpty())
        {
            insumo->setIdinsumo(ui->idinsumo->text().toInt());
        }
        else
        {
            QSqlQuery query;
            query.exec("select coalesce(max(idinsumo),0) from insumo");
            int max_idInsumo;

            while (query.next())
            {
                max_idInsumo = query.value(0).toInt();
            }

            insumo->setIdinsumo(max_idInsumo + 1);

         }

            QDate date = QDate::currentDate();
            insumo->setUltima_compra(date);
            insumo->setNombre(ui->nombre->text());
            insumo->setUnidad_medida(ui->combomedida->currentText());
            insumo->setStock_actual(ui->cantidad->text().toInt());
            insumo->setStock_min(ui->stock_min->text().toInt());
            insumo->setFechaVencimiento(ui->f_vencimiento->date());
            insumo->setEstado("activo");

            insumo->save();

            double precio = 0;
            int row = 0;
            QString nombreProveedor;
            QDjangoQuerySet<Proveedor> proveedores;

            int cantidadFilas = ui->tableWidget->rowCount();

            while(row < cantidadFilas){

                Insumo_Proveedor *ins_prov = new Insumo_Proveedor();
                ins_prov->setInsumo(insumo);

                if (!ui->tableWidget->model()->index(row,3).data().isNull()){ //si no es nulo, se carga el idInsProv

                     int idInsumoProveedor = ui->tableWidget->model()->index(row,3).data().toInt();

                     ins_prov->setId_insumo_proveedor(idInsumoProveedor);

                 }else{ //se obtiene el max si es nuevo

                    QSqlQuery queryInsumoProveedor;
                    queryInsumoProveedor.exec("select coalesce(max(id_insumo_proveedor),0) from insumo_proveedor;");
                    int max;

                    while (queryInsumoProveedor.next())
                    {
                        max = queryInsumoProveedor.value(0).toInt();
                    }

                    ins_prov->setId_insumo_proveedor(max+1);

                }

                 nombreProveedor = ui->tableWidget->model()->index(row,0).data().toString();
                 QSqlQuery queryProveedor;
                 queryProveedor.exec("select distinct id_proveedor from proveedor where nombre like '"+nombreProveedor+"';");
                 int id;

                 while (queryProveedor.next()){

                    id = queryProveedor.value(0).toInt();
                 }

                Proveedor *prov = proveedores.filter(QDjangoWhere("id_proveedor", QDjangoWhere::Equals,id)).at(0);
                ins_prov->setProveedor(prov);
                precio = ui->tableWidget->model()->index(row,1).data().toDouble();
                ins_prov->setPrecio(precio);

                row++;
                ins_prov->save();
                delete ins_prov;
        }

        delete insumo;
        this->close();

     }
}
}

void Registro_Mod_Insumos::on_botonAgregar_clicked()
{

    QString id = ui->idinsumo->text();
     QSqlQuery query;

    QString nombre = ui->listWidget->currentItem()->text();
    query.exec("select distinct proveedor.nombre from proveedor,insumo_proveedor,insumo where proveedor.id_proveedor = insumo_proveedor.proveedor_id and insumo_proveedor.insumo_id = "+id+" and proveedor.nombre like '"+nombre+"';");
    QString nombre_prov;

    while(query.next()){
        nombre_prov = query.value(0).toString();
    }

    if (nombre_prov.isEmpty()){
    //Pasar elementos de un ListWidget a un TableWidget--
    ui->tableWidget->resizeColumnsToContents();
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    //Insertar fila vacia
    ui->tableWidget->insertRow(ui->tableWidget->rowCount());

    //setea el dato seleccionado en la tabla
    ui->tableWidget->model()->setData(ui->tableWidget->model()->index(ui->tableWidget->rowCount()-1, 0), ui->listWidget->currentItem()->text());
    }else{
        QMessageBox m;
        m.setText("El proveedor: "+nombre_prov+" ya se encuentra asociado al insumo");
        m.exec();
    }
}



void Registro_Mod_Insumos::on_botonQuitar_clicked()
{
    QModelIndexList indexes = ui->tableWidget->selectionModel()->selection().indexes();
    QDjango::setDebugEnabled(true);

    if (indexes.count() > 0){

        QModelIndex index1 = indexes.at(2);

            int id = ui->tableWidget->model()->data(index1).toInt();
            int row = index1.row();

        if (!ui->tableWidget->model()->index(row,2).data().isNull()){
            QDjangoQuerySet<Insumo_Proveedor> insumoProv;

            Insumo_Proveedor *insProv = insumoProv.filter(QDjangoWhere("id_insumo_proveedor", QDjangoWhere::Equals, id)).at(0);
            QString nombre_ins_prov = insProv->getProveedor()->getNombre();

            QMessageBox mensaje;
            mensaje.setInformativeText("Esta seguro de que desea dar de baja el registro: "+ nombre_ins_prov +"?");
            mensaje.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
            mensaje.setIcon(QMessageBox::Question);

            int var = mensaje.exec();


                if(var == QMessageBox::Ok){
                    QString idn = QString::number(insProv->getId_insumo_proveedor());
                    QSqlQuery q;
                    q.exec("delete from insumo_proveedor where id_insumo_proveedor = "+ idn +";");
                    ui->tableWidget->removeRow(index1.row());
                }

        }else{

            ui->tableWidget->model()->removeRow(row);
        }
    }else{

        QMessageBox mensaje;
        mensaje.setText("Debe seleccionar un Proveedor que desea eliminar");
        mensaje.setIcon(QMessageBox::Information);
        mensaje.exec();

    }
}

void Registro_Mod_Insumos::on_botonAgregar_unidad_clicked()
{

    Reg_unidad_medida *medida = new Reg_unidad_medida();
    medida->exec();
    delete medida;

    //Se refresca el comboBox de departamentos.
    QDjangoQuerySet<Unidad_medida> unidades;
    if(unidades.count() != ui->combomedida->count() - 1)
    {
        ui->combomedida->addItem(unidades.at(unidades.count()-1)->getDescripcion());
    }


}
